home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Contributed / SpriteWorld / SpriteWorld Files / BlitPixie / Sources / BlitPixieAllBit.c next >
Encoding:
Text File  |  2000-10-06  |  28.1 KB  |  1,323 lines  |  [TEXT/CWIE]

  1. ///--------------------------------------------------------------------------------------
  2. //    BlitPixieAllBit.c
  3. //
  4. //  By Christofer Åkersten <chris@basesoft.se>
  5. //
  6. //    Ideas and code snippets from
  7. //        Tony Myles, Ben Sharpe, Brigham Stevens, Sean Callahan, and Joe Britt
  8. //
  9. //    Description: Implementation of a depth-independent BlitPixie for 68k Macs only.
  10. //
  11. //    Somewhat modified by Anders F Björklund to match other blitters re: param order
  12. ///--------------------------------------------------------------------------------------
  13.  
  14. #ifndef __BLITPIXIE__
  15. #include "BlitPixieHeader.h"
  16. #endif
  17.  
  18. #include "BlitPixieAsm.h"
  19.  
  20. //    generic all-bit routine:
  21. //void BlitPixieAllBit(
  22. //        unsigned char *srcPixelP,        start of first pixel (aligned left to longword boundary)
  23. //        unsigned char *dstPixelP,                
  24. //        unsigned long srcRowStride,        offset from end of line to start of next row
  25. //        unsigned long dstRowStride,
  26. //        unsigned long numBytesPerRow,    number of bytes per row, always a multiple of four
  27. //        unsigned long rowsToCopy,        number of rows
  28. //        unsigned long srcExtraStart,    bit offset to start at, before longs (maximum 31 bits)
  29. //        unsigned long dstExtraStart,    
  30. //        unsigned long dstExtraEnd);        bits to copy/shift after longs
  31.  
  32. #pragma mark *** 680X0:
  33. #if USE_68K_ASSEMBLY
  34.  
  35. #define UNROLL(start, end) \
  36.     move.l    d1, d0; \
  37.     lsr.l    ASM_NUM(4), d1; \
  38.     moveq    ASM_NUM(0x0F), d2; \
  39.     and.l    d2, d0; \
  40.     \
  41.     lea        end, a0; \
  42.     lea        start, a1; \
  43.     sub.l    a0, a1; \
  44.     move.l    a1, d2; \
  45.     asr.l    ASM_NUM(4), d2; \
  46.     mulu.l    d2, d0; \
  47.     add.l    d0, a0;
  48.  
  49. #define REPEAT(instr) \
  50.     instr; \
  51.     instr; \
  52.     instr; \
  53.     instr; \
  54.     instr; \
  55.     instr; \
  56.     instr; \
  57.     instr; \
  58.     instr; \
  59.     instr; \
  60.     instr; \
  61.     instr; \
  62.     instr; \
  63.     instr; \
  64.     instr; \
  65.     instr;
  66.  
  67. ///--------------------------------------------------------------------------------------
  68. //    BlitPixieAllBitRect
  69. ///--------------------------------------------------------------------------------------
  70.  
  71. ASM_FUNC void BlitPixieAllBitRect(
  72.     register unsigned char *srcPixelP,
  73.     register unsigned char *dstPixelP,
  74.     register unsigned long srcRowStride,
  75.     register unsigned long dstRowStride,
  76.     unsigned long numBytesPerRow,
  77.     unsigned long rowsToCopy,
  78.     register unsigned long srcExtraStart,
  79.     register unsigned long dstExtraStart,
  80.     register unsigned long dstExtraEnd)
  81. {
  82.         
  83.     ASM_BEGIN
  84.         
  85.         move.l    numBytesPerRow, d1
  86.         lsr.l    ASM_NUM(2), d1
  87.         beq        @VeryNarrow
  88.         
  89.         tst.l    srcExtraStart
  90.         bne        @SrcExtraStart
  91.         
  92.         tst.l    dstExtraStart
  93.         bne        @DstExtraStart
  94.         
  95.     @NoExtraStart:
  96.         tst.l    dstExtraEnd
  97.         beq        @EvenEven
  98.         bra        @EvenEvenExtra
  99.         
  100.     @DstExtraStart:
  101.         move.l    dstExtraStart, d0
  102.         and.l    ASM_NUM(0x07), d0
  103.         beq        @ADstExtraStart
  104.         
  105.         tst.l    dstExtraEnd
  106.         beq        @EvenOdd
  107.         bra        @EvenOddExtra
  108.         
  109.     @ADstExtraStart:
  110.         move.l    dstExtraStart, d0
  111.         lsr.l    ASM_NUM(3), d0
  112.         add.l    d0, dstPixelP
  113.         tst.l    dstExtraEnd
  114.         beq        @EvenEven
  115.         bra        @EvenEvenExtra
  116.         
  117.     @SrcExtraStart:
  118.         tst.l    dstExtraStart
  119.         bne        @SrcDstExtraStart
  120.     @NoDstExtraStart:
  121.         move.l    srcExtraStart, d0
  122.         and.l    ASM_NUM(0x07), d0
  123.         beq        @ASrcExtraStart
  124.         
  125.         tst.l    dstExtraEnd
  126.         beq        @OddEven
  127.         bra        @OddEvenExtra
  128.         
  129.     @ASrcExtraStart:
  130.         move.l    srcExtraStart, d0
  131.         lsr.l    ASM_NUM(3), d0
  132.         add.l    d0, srcPixelP
  133.         tst.l    dstExtraEnd
  134.         beq        @EvenEven
  135.         bra        @EvenEvenExtra
  136.         
  137.     @SrcDstExtraStart:
  138.         move.l    srcExtraStart, d0
  139.         and.l    ASM_NUM(0x07), d0
  140.         beq        @ASrcDstExtraStart
  141.         move.l    dstExtraStart, d0
  142.         and.l    ASM_NUM(0x07), d0
  143.         beq        @ADstSrcExtraStart
  144.         
  145.         tst.l    dstExtraEnd
  146.         beq        @OddOdd
  147.         bra        @OddOddExtra
  148.         
  149.     @ASrcDstExtraStart:
  150.         move.l    dstExtraStart, d0
  151.         and.l    ASM_NUM(0x07), d0
  152.         beq        @AASrcDstExtraStart
  153.         
  154.         move.l    srcExtraStart, d0
  155.         lsr.l    ASM_NUM(3), d0
  156.         add.l    d0, srcPixelP
  157.         tst.l    dstExtraEnd
  158.         beq        @EvenOdd
  159.         bra        @EvenOddExtra
  160.         
  161.     @ADstSrcExtraStart:
  162.         move.l    dstExtraStart, d0
  163.         lsr.l    ASM_NUM(3), d0
  164.         add.l    d0, dstPixelP
  165.         tst.l    dstExtraEnd
  166.         beq        @OddEven
  167.         bra        @OddEvenExtra
  168.         
  169.     @AASrcDstExtraStart:
  170.         move.l    srcExtraStart, d0
  171.         lsr.l    ASM_NUM(3), d0
  172.         add.l    d0, srcPixelP
  173.         move.l    dstExtraStart, d0
  174.         lsr.l    ASM_NUM(3), d0
  175.         add.l    d0, dstPixelP
  176.         tst.l    dstExtraEnd
  177.         beq        @EvenEven
  178.         bra        @EvenEvenExtra
  179.         
  180.     @EvenEven:
  181. // START Even -> Even
  182.         UNROLL(@EE_ColLoop, @EE_ColLoop_End)
  183.         
  184.         move.l    rowsToCopy, d2
  185.     @EE_RowLoop:
  186.         move.l    d1, d0
  187.         jmp        (a0)
  188.     @EE_ColLoop:
  189. // BLIT
  190. #define    BLIT \
  191.         move.l    (srcPixelP)+, (dstPixelP)+;
  192.         REPEAT(BLIT)
  193. #undef    BLIT
  194.     @EE_ColLoop_End:
  195.         
  196.         subq.l    ASM_NUM(1), d0
  197.         bpl        @EE_ColLoop
  198.         
  199.         adda.l    srcRowStride, srcPixelP
  200.         adda.l    dstRowStride, dstPixelP
  201.         
  202.         subq.l    ASM_NUM(1), d2
  203.         bgt        @EE_RowLoop
  204. // STOP
  205.         bra        @Done
  206.     @EvenEvenExtra:
  207. // START Even -> Even + Extra
  208.         UNROLL(@EEE_ColLoop, @EEE_ColLoop_End)
  209.         
  210.         move.l    rowsToCopy, d2
  211.     @EEE_RowLoop:
  212.         move.l    d1, d0
  213.         jmp        (a0)
  214.     @EEE_ColLoop:
  215. // BLIT
  216. #define    BLIT \
  217.         move.l    (srcPixelP)+, (dstPixelP)+;
  218.         REPEAT(BLIT)
  219. #undef    BLIT
  220.     @EEE_ColLoop_End:
  221.         
  222.         subq.l    ASM_NUM(1), d0
  223.         bpl        @EEE_ColLoop
  224. // BLIT EXTRA
  225.         bfextu    (srcPixelP){0:dstExtraEnd}, d0
  226.         bfins    d0, (dstPixelP){0:dstExtraEnd}
  227.         
  228.         adda.l    srcRowStride, srcPixelP
  229.         adda.l    dstRowStride, dstPixelP
  230.         
  231.         subq.l    ASM_NUM(1), d2
  232.         bgt        @EEE_RowLoop
  233. // STOP
  234.         bra        @Done
  235.         
  236.     @EvenOdd:
  237. // START Even -> Odd
  238.         UNROLL(@EO_ColLoop, @EO_ColLoop_End)
  239.         
  240.         move.l    rowsToCopy, d2
  241.     @EO_RowLoop:
  242.         move.l    d1, d0
  243.         jmp        (a0)
  244.     @EO_ColLoop:
  245. // BLIT
  246. #define    BLIT \
  247.         move.l    (srcPixelP)+, srcExtraStart; \
  248.         bfins    srcExtraStart, (dstPixelP){dstExtraStart:0}; \
  249.         addq.l    ASM_NUM(4), dstPixelP;
  250.         REPEAT(BLIT)
  251. #undef    BLIT
  252.     @EO_ColLoop_End:
  253.         
  254.         subq.l    ASM_NUM(1), d0
  255.         bpl        @EO_ColLoop
  256.         
  257.         adda.l    srcRowStride, srcPixelP
  258.         adda.l    dstRowStride, dstPixelP
  259.         
  260.         subq.l    ASM_NUM(1), d2
  261.         bgt        @EO_RowLoop
  262. // STOP
  263.         bra        @Done
  264.     @EvenOddExtra:
  265. // START Even -> Odd + Extra
  266.         UNROLL(@EOE_ColLoop, @EOE_ColLoop_End)
  267.         
  268.         move.l    rowsToCopy, d2
  269.     @EOE_RowLoop:
  270.         move.l    d1, d0
  271.         jmp        (a0)
  272.     @EOE_ColLoop:
  273. // BLIT
  274. #define    BLIT \
  275.         move.l    (srcPixelP)+, srcExtraStart; \
  276.         bfins    srcExtraStart, (dstPixelP){dstExtraStart:0}; \
  277.         addq.l    ASM_NUM(4), dstPixelP;
  278.         REPEAT(BLIT)
  279. #undef    BLIT
  280.     @EOE_ColLoop_End:
  281.         
  282.         subq.l    ASM_NUM(1), d0
  283.         bpl        @EOE_ColLoop
  284. //BLIT EXTRA
  285.         bfextu    (srcPixelP){0:dstExtraEnd}, srcExtraStart
  286.         bfins    srcExtraStart, (dstPixelP){dstExtraStart:dstExtraEnd}
  287.         
  288.         adda.l    srcRowStride, srcPixelP
  289.         adda.l    dstRowStride, dstPixelP
  290.         
  291.         subq.l    ASM_NUM(1), d2
  292.         bgt        @EOE_RowLoop
  293. // STOP
  294.         bra        @Done
  295.         
  296.     @OddEven:
  297. // START Odd -> Even
  298.         UNROLL(@OE_ColLoop, @OE_ColLoop_End)
  299.         
  300.         move.l    rowsToCopy, d2
  301.     @OE_RowLoop:
  302.         move.l    d1, d0
  303.         jmp        (a0)
  304.     @OE_ColLoop:
  305. // BLIT
  306. #define    BLIT \
  307.         bfextu    (srcPixelP){srcExtraStart:0}, dstExtraStart; \
  308.         move.l    dstExtraStart, (dstPixelP)+; \
  309.         addq.l    ASM_NUM(4), srcPixelP;
  310.         REPEAT(BLIT)
  311. #undef    BLIT
  312.     @OE_ColLoop_End:
  313.         
  314.         subq.l    ASM_NUM(1), d0
  315.         bpl        @OE_ColLoop
  316.         
  317.         adda.l    srcRowStride, srcPixelP
  318.         adda.l    dstRowStride, dstPixelP
  319.         
  320.         subq.l    ASM_NUM(1), d2
  321.         bgt        @OE_RowLoop
  322. // STOP
  323.         bra        @Done
  324.     @OddEvenExtra:
  325. // START Odd -> Even + Extra
  326.         UNROLL(@OEE_ColLoop, @OEE_ColLoop_End)
  327.         
  328.         move.l    rowsToCopy, d2
  329.     @OEE_RowLoop:
  330.         move.l    d1, d0
  331.         jmp        (a0)
  332.     @OEE_ColLoop:
  333. // BLIT
  334. #define    BLIT \
  335.         bfextu    (srcPixelP){srcExtraStart:0}, dstExtraStart; \
  336.         move.l    dstExtraStart, (dstPixelP)+; \
  337.         addq.l    ASM_NUM(4), srcPixelP;
  338.         REPEAT(BLIT)
  339. #undef    BLIT
  340.     @OEE_ColLoop_End:
  341.         
  342.         subq.l    ASM_NUM(1), d0
  343.         bpl        @OEE_ColLoop
  344. // BLIT EXTRA
  345.         bfextu    (srcPixelP){srcExtraStart:dstExtraEnd}, dstExtraStart
  346.         bfins    dstExtraStart, (dstPixelP){0:dstExtraEnd}
  347.         
  348.         adda.l    srcRowStride, srcPixelP
  349.         adda.l    dstRowStride, dstPixelP
  350.         
  351.         subq.l    ASM_NUM(1), d2
  352.         bgt        @OEE_RowLoop
  353. // STOP
  354.         bra        @Done
  355.         
  356.     @OddOdd:
  357. // START Odd -> Odd
  358.         UNROLL(@OO_ColLoop, @OO_ColLoop_End)
  359.         
  360.         move.l    rowsToCopy, d2
  361.     @OO_RowLoop:
  362.         move.l    d1, d0
  363.         jmp        (a0)
  364.     @OO_ColLoop:
  365. // BLIT
  366. #define    BLIT \
  367.         bfextu    (srcPixelP){srcExtraStart:0}, dstExtraEnd; \
  368.         bfins    dstExtraEnd, (dstPixelP){dstExtraStart:0}; \
  369.         addq.l    ASM_NUM(4), srcPixelP; \
  370.         addq.l    ASM_NUM(4), dstPixelP;
  371.         REPEAT(BLIT)
  372. #undef    BLIT
  373.     @OO_ColLoop_End:
  374.         
  375.         subq.l    ASM_NUM(1), d0
  376.         bpl        @OO_ColLoop
  377.         
  378.         adda.l    srcRowStride, srcPixelP
  379.         adda.l    dstRowStride, dstPixelP
  380.         
  381.         subq.l    ASM_NUM(1), d2
  382.         bgt        @OO_RowLoop
  383. // STOP
  384.         bra        @Done
  385.     @OddOddExtra:
  386. // START Odd -> Odd + Extra
  387.         UNROLL(@OOE_ColLoop, @OOE_ColLoop_End)
  388.         
  389.     @OOE_RowLoop:
  390.         move.l    d1, d0
  391.         jmp        (a0)
  392.     @OOE_ColLoop:
  393. // BLIT
  394. #define    BLIT \
  395.         bfextu    (srcPixelP){srcExtraStart:0}, d2; \
  396.         bfins    d2, (dstPixelP){dstExtraStart:0}; \
  397.         addq.l    ASM_NUM(4), srcPixelP; \
  398.         addq.l    ASM_NUM(4), dstPixelP;
  399.         REPEAT(BLIT)
  400. #undef    BLIT
  401.     @OOE_ColLoop_End:
  402.         
  403.         subq.l    ASM_NUM(1), d0
  404.         bpl        @OOE_ColLoop
  405. // BLIT EXTRA
  406.         bfextu    (srcPixelP){srcExtraStart:dstExtraEnd}, d2
  407.         bfins    d2, (dstPixelP){dstExtraStart:dstExtraEnd}
  408.         
  409.         adda.l    srcRowStride, srcPixelP
  410.         adda.l    dstRowStride, dstPixelP
  411.         
  412.         subq.l    ASM_NUM(1), rowsToCopy
  413.         bgt        @OOE_RowLoop
  414. // STOP
  415.         bra        @Done
  416.         
  417.     @VeryNarrow:
  418. // START Very Narrow
  419.         move.l    rowsToCopy, d2
  420.     @VN_RowLoop:
  421. // BLIT
  422.         bfextu    (srcPixelP){srcExtraStart:dstExtraEnd}, d0
  423.         bfins    d0, (dstPixelP){dstExtraStart:dstExtraEnd}
  424.         
  425.         adda.l    srcRowStride, srcPixelP
  426.         adda.l    dstRowStride, dstPixelP
  427.         
  428.         subq.l    ASM_NUM(1), d2
  429.         bgt        @VN_RowLoop
  430. // STOP
  431.         
  432.     @Done:
  433.         
  434.     ASM_END
  435. }
  436.  
  437. ///--------------------------------------------------------------------------------------
  438. //    BlitPixieAllBitMask
  439. ///--------------------------------------------------------------------------------------
  440.  
  441. ASM_FUNC void BlitPixieAllBitMask(
  442.     register unsigned char *srcPixelP,
  443.     register unsigned char *dstPixelP,
  444.     register unsigned char *maskPixelP,
  445.     register unsigned long srcRowStride,
  446.     register unsigned long dstRowStride,
  447.     unsigned long numBytesPerRow,
  448.     unsigned long rowsToCopy,
  449.     register unsigned long srcExtraStart,
  450.     register unsigned long dstExtraStart,
  451.     register unsigned long dstExtraEnd)
  452. {
  453.         
  454.     ASM_BEGIN
  455.         
  456.         move.l    numBytesPerRow, d1
  457.         lsr.l    ASM_NUM(2), d1
  458.         beq        @VeryNarrow
  459.         
  460.         tst.l    srcExtraStart
  461.         bne        @SrcExtraStart
  462.         
  463.         tst.l    dstExtraStart
  464.         bne        @DstExtraStart
  465.         
  466.     @NoExtraStart:
  467.         tst.l    dstExtraEnd
  468.         beq        @EvenEven
  469.         bra        @EvenEvenExtra
  470.         
  471.     @DstExtraStart:
  472.         move.l    dstExtraStart, d0
  473.         and.l    ASM_NUM(0x07), d0
  474.         beq        @ADstExtraStart
  475.         
  476.         tst.l    dstExtraEnd
  477.         beq        @EvenOdd
  478.         bra        @EvenOddExtra
  479.         
  480.     @ADstExtraStart:
  481.         move.l    dstExtraStart, d0
  482.         lsr.l    ASM_NUM(3), d0
  483.         add.l    d0, dstPixelP
  484.         tst.l    dstExtraEnd
  485.         beq        @EvenEven
  486.         bra        @EvenEvenExtra
  487.         
  488.     @SrcExtraStart:
  489.         tst.l    dstExtraStart
  490.         bne        @SrcDstExtraStart
  491.     @NoDstExtraStart:
  492.         move.l    srcExtraStart, d0
  493.         and.l    ASM_NUM(0x07), d0
  494.         beq        @ASrcExtraStart
  495.         
  496.         tst.l    dstExtraEnd
  497.         beq        @OddEven
  498.         bra        @OddEvenExtra
  499.         
  500.     @ASrcExtraStart:
  501.         move.l    srcExtraStart, d0
  502.         lsr.l    ASM_NUM(3), d0
  503.         add.l    d0, srcPixelP
  504.         add.l    d0, maskPixelP
  505.         tst.l    dstExtraEnd
  506.         beq        @EvenEven
  507.         bra        @EvenEvenExtra
  508.         
  509.     @SrcDstExtraStart:
  510.         move.l    srcExtraStart, d0
  511.         and.l    ASM_NUM(0x07), d0
  512.         beq        @ASrcDstExtraStart
  513.         move.l    dstExtraStart, d0
  514.         and.l    ASM_NUM(0x07), d0
  515.         beq        @ADstSrcExtraStart
  516.         
  517.         tst.l    dstExtraEnd
  518.         beq        @OddOdd
  519.         bra        @OddOddExtra
  520.         
  521.     @ASrcDstExtraStart:
  522.         move.l    dstExtraStart, d0
  523.         and.l    ASM_NUM(0x07), d0
  524.         beq        @AASrcDstExtraStart
  525.         
  526.         move.l    srcExtraStart, d0
  527.         lsr.l    ASM_NUM(3), d0
  528.         add.l    d0, srcPixelP
  529.         add.l    d0, maskPixelP
  530.         tst.l    dstExtraEnd
  531.         beq        @EvenOdd
  532.         bra        @EvenOddExtra
  533.         
  534.     @ADstSrcExtraStart:
  535.         move.l    dstExtraStart, d0
  536.         lsr.l    ASM_NUM(3), d0
  537.         add.l    d0, dstPixelP
  538.         tst.l    dstExtraEnd
  539.         beq        @OddEven
  540.         bra        @OddEvenExtra
  541.         
  542.     @AASrcDstExtraStart:
  543.         move.l    srcExtraStart, d0
  544.         lsr.l    ASM_NUM(3), d0
  545.         add.l    d0, srcPixelP
  546.         add.l    d0, maskPixelP
  547.         move.l    dstExtraStart, d0
  548.         lsr.l    ASM_NUM(3), d0
  549.         add.l    d0, dstPixelP
  550.         tst.l    dstExtraEnd
  551.         beq        @EvenEven
  552.         bra        @EvenEvenExtra
  553.         
  554.     @EvenEven:
  555. // START Even -> Even
  556.         UNROLL(@EE_ColLoop, @EE_ColLoop_End)
  557.         
  558.         move.l    rowsToCopy, d2
  559.     @EE_RowLoop:
  560.         move.l    d1, d0
  561.         jmp        (a0)
  562.     @EE_ColLoop:
  563. // BLIT
  564. #define    BLIT \
  565.         move.l    (dstPixelP), dstExtraEnd; \
  566.         and.l    (maskPixelP)+, dstExtraEnd; \
  567.         or.l    (srcPixelP)+, dstExtraEnd; \
  568.         move.l    dstExtraEnd, (dstPixelP)+;
  569.         REPEAT(BLIT)
  570. #undef    BLIT
  571.     @EE_ColLoop_End:
  572.         
  573.         subq.l    ASM_NUM(1), d0
  574.         bpl        @EE_ColLoop
  575.         
  576.         adda.l    srcRowStride, srcPixelP
  577.         adda.l    dstRowStride, dstPixelP
  578.         adda.l    srcRowStride, maskPixelP
  579.         
  580.         subq.l    ASM_NUM(1), d2
  581.         bgt        @EE_RowLoop
  582. // STOP
  583.         bra        @Done
  584.     @EvenEvenExtra:
  585. // START Even -> Even + Extra
  586.         UNROLL(@EEE_ColLoop, @EEE_ColLoop_End)
  587.         
  588.         move.l    rowsToCopy, d2
  589.     @EEE_RowLoop:
  590.         move.l    d1, d0
  591.         jmp        (a0)
  592.     @EEE_ColLoop:
  593. // BLIT
  594. #define    BLIT \
  595.         move.l    (dstPixelP), srcExtraStart; \
  596.         and.l    (maskPixelP)+, srcExtraStart; \
  597.         or.l    (srcPixelP)+, srcExtraStart; \
  598.         move.l    srcExtraStart, (dstPixelP)+;
  599.         REPEAT(BLIT)
  600. #undef    BLIT
  601.     @EEE_ColLoop_End:
  602.         
  603.         subq.l    ASM_NUM(1), d0
  604.         bpl        @EEE_ColLoop
  605. // BLIT EXTRA
  606.         bfextu    (dstPixelP){0:dstExtraEnd}, srcExtraStart
  607.         bfextu    (maskPixelP){0:dstExtraEnd}, dstExtraStart
  608.         and.l    dstExtraStart, srcExtraStart
  609.         bfextu    (srcPixelP){0:dstExtraEnd}, dstExtraStart
  610.         or.l    dstExtraStart, srcExtraStart
  611.         bfins    srcExtraStart, (dstPixelP){0:dstExtraEnd}
  612.         
  613.         adda.l    srcRowStride, srcPixelP
  614.         adda.l    dstRowStride, dstPixelP
  615.         adda.l    srcRowStride, maskPixelP
  616.         
  617.         subq.l    ASM_NUM(1), d2
  618.         bgt        @EEE_RowLoop
  619. // STOP
  620.         bra        @Done
  621.         
  622.     @EvenOdd:
  623. // START Even -> Odd
  624.         UNROLL(@EO_ColLoop, @EO_ColLoop_End)
  625.         
  626.         move.l    rowsToCopy, d2
  627.     @EO_RowLoop:
  628.         move.l    d1, d0
  629.         jmp        (a0)
  630.     @EO_ColLoop:
  631. // BLIT
  632. #define    BLIT \
  633.         bfextu    (dstPixelP){dstExtraStart:0}, srcExtraStart; \
  634.         and.l    (maskPixelP)+, srcExtraStart; \
  635.         or.l    (srcPixelP)+, srcExtraStart; \
  636.         bfins    srcExtraStart, (dstPixelP){dstExtraStart:0}; \
  637.         addq.l    ASM_NUM(4), dstPixelP;
  638.         REPEAT(BLIT)
  639. #undef    BLIT
  640.     @EO_ColLoop_End:
  641.         
  642.         subq.l    ASM_NUM(1), d0
  643.         bpl        @EO_ColLoop
  644.         
  645.         adda.l    srcRowStride, srcPixelP
  646.         adda.l    dstRowStride, dstPixelP
  647.         adda.l    srcRowStride, maskPixelP
  648.         
  649.         subq.l    ASM_NUM(1), d2
  650.         bgt        @EO_RowLoop
  651. // STOP
  652.         bra        @Done
  653.     @EvenOddExtra:
  654. // START Even -> Odd + Extra
  655.         UNROLL(@EOE_ColLoop, @EOE_ColLoop_End)
  656.         
  657.         move.l    rowsToCopy, d2
  658.     @EOE_RowLoop:
  659.         move.l    d1, d0
  660.         jmp        (a0)
  661.     @EOE_ColLoop:
  662. // BLIT
  663. #define    BLIT \
  664.         bfextu    (dstPixelP){dstExtraStart:0}, srcExtraStart; \
  665.         and.l    (maskPixelP)+, srcExtraStart; \
  666.         or.l    (srcPixelP)+, srcExtraStart; \
  667.         bfins    srcExtraStart, (dstPixelP){dstExtraStart:0}; \
  668.         addq.l    ASM_NUM(4), dstPixelP;
  669.         REPEAT(BLIT)
  670. #undef    BLIT
  671.     @EOE_ColLoop_End:
  672.         
  673.         subq.l    ASM_NUM(1), d0
  674.         bpl        @EOE_ColLoop
  675. //BLIT EXTRA
  676.         bfextu    (dstPixelP){dstExtraStart:dstExtraEnd}, srcExtraStart
  677.         bfextu    (maskPixelP){0:dstExtraEnd}, d0
  678.         and.l    d0, srcExtraStart
  679.         bfextu    (srcPixelP){0:dstExtraEnd}, d0
  680.         or.l    d0, srcExtraStart
  681.         bfins    srcExtraStart, (dstPixelP){dstExtraStart:dstExtraEnd}
  682.         
  683.         adda.l    srcRowStride, srcPixelP
  684.         adda.l    dstRowStride, dstPixelP
  685.         adda.l    srcRowStride, maskPixelP
  686.         
  687.         subq.l    ASM_NUM(1), d2
  688.         bgt        @EOE_RowLoop
  689. // STOP
  690.         bra        @Done
  691.         
  692.     @OddEven:
  693. // START Odd -> Even
  694.         UNROLL(@OE_ColLoop, @OE_ColLoop_End)
  695.         
  696.         move.l    rowsToCopy, d2
  697.     @OE_RowLoop:
  698.         move.l    d1, d0
  699.         jmp        (a0)
  700.     @OE_ColLoop:
  701. // BLIT
  702. #define    BLIT \
  703.         bfextu    (maskPixelP){srcExtraStart:0}, dstExtraStart; \
  704.         and.l    dstExtraStart, (dstPixelP); \
  705.         bfextu    (srcPixelP){srcExtraStart:0}, dstExtraStart; \
  706.         or.l    dstExtraStart, (dstPixelP)+; \
  707.         addq.l    ASM_NUM(4), srcPixelP; \
  708.         addq.l    ASM_NUM(4), maskPixelP;
  709.         REPEAT(BLIT)
  710. #undef    BLIT
  711.     @OE_ColLoop_End:
  712.         
  713.         subq.l    ASM_NUM(1), d0
  714.         bpl        @OE_ColLoop
  715.         
  716.         adda.l    srcRowStride, srcPixelP
  717.         adda.l    dstRowStride, dstPixelP
  718.         adda.l    srcRowStride, maskPixelP
  719.         
  720.         subq.l    ASM_NUM(1), d2
  721.         bgt        @OE_RowLoop
  722. // STOP
  723.         bra        @Done
  724.     @OddEvenExtra:
  725. // START Odd -> Even + Extra
  726.         UNROLL(@OEE_ColLoop, @OEE_ColLoop_End)
  727.         
  728.         move.l    rowsToCopy, d2
  729.     @OEE_RowLoop:
  730.         move.l    d1, d0
  731.         jmp        (a0)
  732.     @OEE_ColLoop:
  733. // BLIT
  734. #define    BLIT \
  735.         bfextu    (maskPixelP){srcExtraStart:0}, dstExtraStart; \
  736.         and.l    dstExtraStart, (dstPixelP); \
  737.         bfextu    (srcPixelP){srcExtraStart:0}, dstExtraStart; \
  738.         or.l    dstExtraStart, (dstPixelP)+; \
  739.         addq.l    ASM_NUM(4), srcPixelP; \
  740.         addq.l    ASM_NUM(4), maskPixelP;
  741.         REPEAT(BLIT)
  742. #undef    BLIT
  743.     @OEE_ColLoop_End:
  744.         
  745.         subq.l    ASM_NUM(1), d0
  746.         bpl        @OEE_ColLoop
  747. // BLIT EXTRA
  748.         bfextu    (dstPixelP){0:dstExtraEnd}, d0
  749.         bfextu    (maskPixelP){srcExtraStart:dstExtraEnd}, dstExtraStart
  750.         and.l    dstExtraStart, d0
  751.         bfextu    (srcPixelP){srcExtraStart:dstExtraEnd}, dstExtraStart
  752.         or.l    dstExtraStart, d0
  753.         bfins    d0, (dstPixelP){0:dstExtraEnd}
  754.         
  755.         adda.l    srcRowStride, srcPixelP
  756.         adda.l    dstRowStride, dstPixelP
  757.         adda.l    srcRowStride, maskPixelP
  758.         
  759.         subq.l    ASM_NUM(1), d2
  760.         bgt        @OEE_RowLoop
  761. // STOP
  762.         bra        @Done
  763.         
  764.     @OddOdd:
  765. // START Odd -> Odd
  766.         UNROLL(@OO_ColLoop, @OO_ColLoop_End)
  767.         
  768.     @OO_RowLoop:
  769.         move.l    d1, d0
  770.         jmp        (a0)
  771.     @OO_ColLoop:
  772. // BLIT
  773. #define    BLIT \
  774.         bfextu    (dstPixelP){dstExtraStart:0}, dstExtraEnd; \
  775.         bfextu    (maskPixelP){srcExtraStart:0}, d2; \
  776.         and.l    d2, dstExtraEnd; \
  777.         bfextu    (srcPixelP){srcExtraStart:0}, d2; \
  778.         or.l    d2, dstExtraEnd; \
  779.         bfins    dstExtraEnd, (dstPixelP){dstExtraStart:0}; \
  780.         addq.l    ASM_NUM(4), srcPixelP; \
  781.         addq.l    ASM_NUM(4), dstPixelP; \
  782.         addq.l    ASM_NUM(4), maskPixelP;
  783.         REPEAT(BLIT)
  784. #undef    BLIT
  785.     @OO_ColLoop_End:
  786.         
  787.         subq.l    ASM_NUM(1), d0
  788.         bpl        @OO_ColLoop
  789.         
  790.         adda.l    srcRowStride, srcPixelP
  791.         adda.l    dstRowStride, dstPixelP
  792.         adda.l    srcRowStride, maskPixelP
  793.         
  794.         subq.l    ASM_NUM(1), rowsToCopy
  795.         bgt        @OO_RowLoop
  796. // STOP
  797.         bra        @Done
  798.     @OddOddExtra:
  799. // START Odd -> Odd + Extra
  800.         UNROLL(@OOE_ColLoop, @OOE_ColLoop_End)
  801.         
  802.         move.l    d1, numBytesPerRow
  803.     @OOE_RowLoop:
  804.         move.l    numBytesPerRow, d0
  805.         jmp        (a0)
  806.     @OOE_ColLoop:
  807. // BLIT
  808. #define    BLIT \
  809.         bfextu    (dstPixelP){dstExtraStart:0}, d1; \
  810.         bfextu    (maskPixelP){srcExtraStart:0}, d2; \
  811.         and.l    d2, d1; \
  812.         bfextu    (srcPixelP){srcExtraStart:0}, d2; \
  813.         or.l    d2, d1; \
  814.         bfins    d1, (dstPixelP){dstExtraStart:0}; \
  815.         addq.l    ASM_NUM(4), srcPixelP; \
  816.         addq.l    ASM_NUM(4), dstPixelP; \
  817.         addq.l    ASM_NUM(4), maskPixelP;
  818.         REPEAT(BLIT)
  819. #undef    BLIT
  820.     @OOE_ColLoop_End:
  821.         
  822.         subq.l    ASM_NUM(1), d0
  823.         bpl        @OOE_ColLoop
  824. // BLIT EXTRA
  825.         bfextu    (dstPixelP){dstExtraStart:dstExtraEnd}, d0
  826.         bfextu    (maskPixelP){srcExtraStart:dstExtraEnd}, d2
  827.         and.l    d2, d0
  828.         bfextu    (srcPixelP){srcExtraStart:dstExtraEnd}, d2
  829.         or.l    d2, d0
  830.         bfins    d0, (dstPixelP){dstExtraStart:dstExtraEnd}
  831.         
  832.         adda.l    srcRowStride, srcPixelP
  833.         adda.l    dstRowStride, dstPixelP
  834.         adda.l    srcRowStride, maskPixelP
  835.         
  836.         subq.l    ASM_NUM(1), rowsToCopy
  837.         bgt        @OOE_RowLoop
  838. // STOP
  839.         bra        @Done
  840.         
  841.     @VeryNarrow:
  842. // START Very Narrow
  843.         move.l    rowsToCopy, d2
  844.     @VN_RowLoop:
  845. // BLIT
  846.         bfextu    (dstPixelP){dstExtraStart:dstExtraEnd}, d0
  847.         bfextu    (maskPixelP){srcExtraStart:dstExtraEnd}, d1
  848.         and.l    d1, d0
  849.         bfextu    (srcPixelP){srcExtraStart:dstExtraEnd}, d1
  850.         or.l    d1, d0
  851.         bfins    d0, (dstPixelP){dstExtraStart:dstExtraEnd}
  852.         
  853.         adda.l    srcRowStride, srcPixelP
  854.         adda.l    dstRowStride, dstPixelP
  855.         adda.l    srcRowStride, maskPixelP
  856.         
  857.         subq.l    ASM_NUM(1), d2
  858.         bgt        @VN_RowLoop
  859. // STOP
  860.         
  861.     @Done:
  862.         
  863.     ASM_END
  864. }
  865.  
  866. ///--------------------------------------------------------------------------------------
  867. //    BlitPixieAllBitPartialMask
  868. ///--------------------------------------------------------------------------------------
  869.  
  870. ASM_FUNC void BlitPixieAllBitPartialMask(
  871.     register unsigned char *srcPixelP,
  872.     register unsigned char *dstPixelP,
  873.     register unsigned char *maskPixelP,
  874.     register unsigned long srcRowStride,
  875.     register unsigned long dstRowStride,
  876.     unsigned long numBytesPerRow,
  877.     unsigned long rowsToCopy,
  878.     register unsigned long srcExtraStart,
  879.     register unsigned long dstExtraStart,
  880.     register unsigned long dstExtraEnd)
  881. {
  882.         
  883.     ASM_BEGIN
  884.         
  885.         move.l    numBytesPerRow, d1
  886.         lsr.l    ASM_NUM(2), d1
  887.         beq        @VeryNarrow
  888.         
  889.         tst.l    srcExtraStart
  890.         bne        @SrcExtraStart
  891.         
  892.         tst.l    dstExtraStart
  893.         bne        @DstExtraStart
  894.         
  895.     @NoExtraStart:
  896.         tst.l    dstExtraEnd
  897.         beq        @EvenEven
  898.         bra        @EvenEvenExtra
  899.         
  900.     @DstExtraStart:
  901.         move.l    dstExtraStart, d0
  902.         and.l    ASM_NUM(0x07), d0
  903.         beq        @ADstExtraStart
  904.         
  905.         tst.l    dstExtraEnd
  906.         beq        @EvenOdd
  907.         bra        @EvenOddExtra
  908.         
  909.     @ADstExtraStart:
  910.         move.l    dstExtraStart, d0
  911.         lsr.l    ASM_NUM(3), d0
  912.         add.l    d0, dstPixelP
  913.         tst.l    dstExtraEnd
  914.         beq        @EvenEven
  915.         bra        @EvenEvenExtra
  916.         
  917.     @SrcExtraStart:
  918.         tst.l    dstExtraStart
  919.         bne        @SrcDstExtraStart
  920.     @NoDstExtraStart:
  921.         move.l    srcExtraStart, d0
  922.         and.l    ASM_NUM(0x07), d0
  923.         beq        @ASrcExtraStart
  924.         
  925.         tst.l    dstExtraEnd
  926.         beq        @OddEven
  927.         bra        @OddEvenExtra
  928.         
  929.     @ASrcExtraStart:
  930.         move.l    srcExtraStart, d0
  931.         lsr.l    ASM_NUM(3), d0
  932.         add.l    d0, srcPixelP
  933.         add.l    d0, maskPixelP
  934.         tst.l    dstExtraEnd
  935.         beq        @EvenEven
  936.         bra        @EvenEvenExtra
  937.         
  938.     @SrcDstExtraStart:
  939.         move.l    srcExtraStart, d0
  940.         and.l    ASM_NUM(0x07), d0
  941.         beq        @ASrcDstExtraStart
  942.         move.l    dstExtraStart, d0
  943.         and.l    ASM_NUM(0x07), d0
  944.         beq        @ADstSrcExtraStart
  945.         
  946.         tst.l    dstExtraEnd
  947.         beq        @OddOdd
  948.         bra        @OddOddExtra
  949.         
  950.     @ASrcDstExtraStart:
  951.         move.l    dstExtraStart, d0
  952.         and.l    ASM_NUM(0x07), d0
  953.         beq        @AASrcDstExtraStart
  954.         
  955.         move.l    srcExtraStart, d0
  956.         lsr.l    ASM_NUM(3), d0
  957.         add.l    d0, srcPixelP
  958.         add.l    d0, maskPixelP
  959.         tst.l    dstExtraEnd
  960.         beq        @EvenOdd
  961.         bra        @EvenOddExtra
  962.         
  963.     @ADstSrcExtraStart:
  964.         move.l    dstExtraStart, d0
  965.         lsr.l    ASM_NUM(3), d0
  966.         add.l    d0, dstPixelP
  967.         tst.l    dstExtraEnd
  968.         beq        @OddEven
  969.         bra        @OddEvenExtra
  970.         
  971.     @AASrcDstExtraStart:
  972.         move.l    srcExtraStart, d0
  973.         lsr.l    ASM_NUM(3), d0
  974.         add.l    d0, srcPixelP
  975.         add.l    d0, maskPixelP
  976.         move.l    dstExtraStart, d0
  977.         lsr.l    ASM_NUM(3), d0
  978.         add.l    d0, dstPixelP
  979.         tst.l    dstExtraEnd
  980.         beq        @EvenEven
  981.         bra        @EvenEvenExtra
  982.         
  983.     @EvenEven:
  984. // START Even -> Even
  985.         UNROLL(@EE_ColLoop, @EE_ColLoop_End)
  986.         
  987.         move.l    rowsToCopy, d2
  988.     @EE_RowLoop:
  989.         move.l    d1, d0
  990.         jmp        (a0)
  991.     @EE_ColLoop:
  992. // BLIT
  993. #define    BLIT \
  994.         move.l    (maskPixelP)+, dstExtraEnd; \
  995.         and.l    dstExtraEnd, (dstPixelP); \
  996.         not.l    dstExtraEnd; \
  997.         and.l    (srcPixelP)+, dstExtraEnd; \
  998.         or.l    dstExtraEnd, (dstPixelP)+;
  999.         REPEAT(BLIT)
  1000. #undef    BLIT
  1001.     @EE_ColLoop_End:
  1002.         
  1003.         subq.l    ASM_NUM(1), d0
  1004.         bpl        @EE_ColLoop
  1005.         
  1006.         adda.l    srcRowStride, srcPixelP
  1007.         adda.l    dstRowStride, dstPixelP
  1008.         adda.l    srcRowStride, maskPixelP
  1009.         
  1010.         subq.l    ASM_NUM(1), d2
  1011.         bgt        @EE_RowLoop
  1012. // STOP
  1013.         bra        @Done
  1014.     @EvenEvenExtra:
  1015. // START Even -> Even + Extra
  1016.         UNROLL(@EEE_ColLoop, @EEE_ColLoop_End)
  1017.         
  1018.         move.l    rowsToCopy, d2
  1019.     @EEE_RowLoop:
  1020.         move.l    d1, d0
  1021.         jmp        (a0)
  1022.     @EEE_ColLoop:
  1023. // BLIT
  1024. #define    BLIT \
  1025.         move.l    (maskPixelP)+, srcExtraStart; \
  1026.         and.l    srcExtraStart, (dstPixelP); \
  1027.         not.l    srcExtraStart; \
  1028.         and.l    (srcPixelP)+, srcExtraStart; \
  1029.         or.l    srcExtraStart, (dstPixelP)+;
  1030.         REPEAT(BLIT)
  1031. #undef    BLIT
  1032.     @EEE_ColLoop_End:
  1033.         
  1034.         subq.l    ASM_NUM(1), d0
  1035.         bpl        @EEE_ColLoop
  1036. // BLIT EXTRA
  1037.         bfextu    (srcPixelP){0:dstExtraEnd}, d0
  1038.         bfextu    (dstPixelP){0:dstExtraEnd}, srcExtraStart
  1039.         bfextu    (maskPixelP){0:dstExtraEnd}, dstExtraStart
  1040.         and.l    dstExtraStart, srcExtraStart
  1041.         not.l    dstExtraStart
  1042.         and.l    dstExtraStart, d0
  1043.         or.l    srcExtraStart, d0
  1044.         bfins    d0, (dstPixelP){0:dstExtraEnd}
  1045.         
  1046.         adda.l    srcRowStride, srcPixelP
  1047.         adda.l    dstRowStride, dstPixelP
  1048.         adda.l    srcRowStride, maskPixelP
  1049.         
  1050.         subq.l    ASM_NUM(1), d2
  1051.         bgt        @EEE_RowLoop
  1052. // STOP
  1053.         bra        @Done
  1054.         
  1055.     @EvenOdd:
  1056. // START Even -> Odd
  1057.         UNROLL(@EO_ColLoop, @EO_ColLoop_End)
  1058.         
  1059.         move.l    rowsToCopy, d2
  1060.     @EO_RowLoop:
  1061.         move.l    d1, d0
  1062.         jmp        (a0)
  1063.     @EO_ColLoop:
  1064. // BLIT
  1065. #define    BLIT \
  1066.         move.l    (maskPixelP)+, dstExtraEnd; \
  1067.         bfextu    (dstPixelP){dstExtraStart:0}, srcExtraStart; \
  1068.         and.l    dstExtraEnd, srcExtraStart; \
  1069.         not.l    dstExtraEnd; \
  1070.         and.l    (srcPixelP)+, dstExtraEnd; \
  1071.         or.l    dstExtraEnd, srcExtraStart; \
  1072.         bfins    srcExtraStart, (dstPixelP){dstExtraStart:0}; \
  1073.         addq.l    ASM_NUM(4), dstPixelP;
  1074.         REPEAT(BLIT)
  1075. #undef    BLIT
  1076.     @EO_ColLoop_End:
  1077.         
  1078.         subq.l    ASM_NUM(1), d0
  1079.         bpl        @EO_ColLoop
  1080.         
  1081.         adda.l    srcRowStride, srcPixelP
  1082.         adda.l    dstRowStride, dstPixelP
  1083.         adda.l    srcRowStride, maskPixelP
  1084.         
  1085.         subq.l    ASM_NUM(1), d2
  1086.         bgt        @EO_RowLoop
  1087. // STOP
  1088.         bra        @Done
  1089.     @EvenOddExtra:
  1090. // START Even -> Odd + Extra
  1091.         UNROLL(@EOE_ColLoop, @EOE_ColLoop_End)
  1092.         
  1093. //        move.l    rowsToCopy, d2
  1094.     @EOE_RowLoop:
  1095.         move.l    d1, d0
  1096.         jmp        (a0)
  1097.     @EOE_ColLoop:
  1098. // BLIT
  1099. #define    BLIT \
  1100.         move.l    (maskPixelP)+, d2; \
  1101.         bfextu    (dstPixelP){dstExtraStart:0}, srcExtraStart; \
  1102.         and.l    d2, srcExtraStart; \
  1103.         not.l    d2; \
  1104.         and.l    (srcPixelP)+, d2; \
  1105.         or.l    d2, srcExtraStart; \
  1106.         bfins    srcExtraStart, (dstPixelP){dstExtraStart:0}; \
  1107.         addq.l    ASM_NUM(4), dstPixelP;
  1108.         REPEAT(BLIT)
  1109. #undef    BLIT
  1110.     @EOE_ColLoop_End:
  1111.         
  1112.         subq.l    ASM_NUM(1), d0
  1113.         bpl        @EOE_ColLoop
  1114. //BLIT EXTRA
  1115.         bfextu    (srcPixelP){0:dstExtraEnd}, d0
  1116.         bfextu    (dstPixelP){dstExtraStart:dstExtraEnd}, srcExtraStart
  1117.         bfextu    (maskPixelP){0:dstExtraEnd}, d2
  1118.         and.l    d2, srcExtraStart
  1119.         not.l    d2
  1120.         and.l    d2, d0
  1121.         or.l    srcExtraStart, d0
  1122.         bfins    d0, (dstPixelP){dstExtraStart:dstExtraEnd}
  1123.         
  1124.         adda.l    srcRowStride, srcPixelP
  1125.         adda.l    dstRowStride, dstPixelP
  1126.         adda.l    srcRowStride, maskPixelP
  1127.         
  1128.         subq.l    ASM_NUM(1), rowsToCopy
  1129.         bgt        @EOE_RowLoop
  1130. // STOP
  1131.         bra        @Done
  1132.         
  1133.     @OddEven:
  1134. // START Odd -> Even
  1135.         UNROLL(@OE_ColLoop, @OE_ColLoop_End)
  1136.         
  1137.         move.l    rowsToCopy, d2
  1138.     @OE_RowLoop:
  1139.         move.l    d1, d0
  1140.         jmp        (a0)
  1141.     @OE_ColLoop:
  1142. // BLIT
  1143. #define    BLIT \
  1144.         bfextu    (srcPixelP){srcExtraStart:0}, dstExtraStart; \
  1145.         bfextu    (maskPixelP){srcExtraStart:0}, dstExtraEnd; \
  1146.         and.l    dstExtraEnd, (dstPixelP); \
  1147.         not.l    dstExtraEnd; \
  1148.         and.l    dstExtraEnd, dstExtraStart; \
  1149.         or.l    dstExtraStart, (dstPixelP)+; \
  1150.         addq.l    ASM_NUM(4), srcPixelP; \
  1151.         addq.l    ASM_NUM(4), maskPixelP;
  1152.         REPEAT(BLIT)
  1153. #undef    BLIT
  1154.     @OE_ColLoop_End:
  1155.         
  1156.         subq.l    ASM_NUM(1), d0
  1157.         bpl        @OE_ColLoop
  1158.         
  1159.         adda.l    srcRowStride, srcPixelP
  1160.         adda.l    dstRowStride, dstPixelP
  1161.         adda.l    srcRowStride, maskPixelP
  1162.         
  1163.         subq.l    ASM_NUM(1), d2
  1164.         bgt        @OE_RowLoop
  1165. // STOP
  1166.         bra        @Done
  1167.     @OddEvenExtra:
  1168. // START Odd -> Even + Extra
  1169.         UNROLL(@OEE_ColLoop, @OEE_ColLoop_End)
  1170.         
  1171.     @OEE_RowLoop:
  1172.         move.l    d1, d0
  1173.         jmp        (a0)
  1174.     @OEE_ColLoop:
  1175. // BLIT
  1176. #define    BLIT \
  1177.         bfextu    (srcPixelP){srcExtraStart:0}, dstExtraStart; \
  1178.         bfextu    (maskPixelP){srcExtraStart:0}, d2; \
  1179.         and.l    d2, (dstPixelP); \
  1180.         not.l    d2; \
  1181.         and.l    d2, dstExtraStart; \
  1182.         or.l    dstExtraStart, (dstPixelP)+; \
  1183.         addq.l    ASM_NUM(4), srcPixelP; \
  1184.         addq.l    ASM_NUM(4), maskPixelP;
  1185.         REPEAT(BLIT)
  1186. #undef    BLIT
  1187.     @OEE_ColLoop_End:
  1188.         
  1189.         subq.l    ASM_NUM(1), d0
  1190.         bpl        @OEE_ColLoop
  1191. // BLIT EXTRA
  1192.         bfextu    (srcPixelP){srcExtraStart:dstExtraEnd}, d0
  1193.         bfextu    (dstPixelP){0:dstExtraEnd}, dstExtraStart
  1194.         bfextu    (maskPixelP){srcExtraStart:dstExtraEnd}, d2
  1195.         and.l    d2, dstExtraStart
  1196.         not.l    d2
  1197.         and.l    d2, d0
  1198.         or.l    dstExtraStart, d0
  1199.         bfins    d0, (dstPixelP){0:dstExtraEnd}
  1200.         
  1201.         adda.l    srcRowStride, srcPixelP
  1202.         adda.l    dstRowStride, dstPixelP
  1203.         adda.l    srcRowStride, maskPixelP
  1204.         
  1205.         subq.l    ASM_NUM(1), rowsToCopy
  1206.         bgt        @OEE_RowLoop
  1207. // STOP
  1208.         bra        @Done
  1209.         
  1210.     @OddOdd:
  1211. // START Odd -> Odd
  1212.         UNROLL(@OO_ColLoop, @OO_ColLoop_End)
  1213.         
  1214.         move.l    d1, numBytesPerRow
  1215.     @OO_RowLoop:
  1216.         move.l    numBytesPerRow, d0
  1217.         jmp        (a0)
  1218.     @OO_ColLoop:
  1219. // BLIT
  1220. #define    BLIT \
  1221.         bfextu    (srcPixelP){srcExtraStart:0}, d1; \
  1222.         bfextu    (dstPixelP){dstExtraStart:0}, dstExtraEnd; \
  1223.         bfextu    (maskPixelP){srcExtraStart:0}, d2; \
  1224.         and.l    d2, dstExtraEnd; \
  1225.         not.l    d2; \
  1226.         and.l    d2, d1; \
  1227.         or.l    dstExtraEnd, d1; \
  1228.         bfins    d1, (dstPixelP){dstExtraStart:0}; \
  1229.         addq.l    ASM_NUM(4), srcPixelP; \
  1230.         addq.l    ASM_NUM(4), dstPixelP; \
  1231.         addq.l    ASM_NUM(4), maskPixelP;
  1232.         REPEAT(BLIT)
  1233. #undef    BLIT
  1234.     @OO_ColLoop_End:
  1235.         
  1236.         subq.l    ASM_NUM(1), d0
  1237.         bpl        @OO_ColLoop
  1238.         
  1239.         adda.l    srcRowStride, srcPixelP
  1240.         adda.l    dstRowStride, dstPixelP
  1241.         adda.l    srcRowStride, maskPixelP
  1242.         
  1243.         subq.l    ASM_NUM(1), rowsToCopy
  1244.         bgt        @OO_RowLoop
  1245. // STOP
  1246.         bra        @Done
  1247.     @OddOddExtra:
  1248. // START Odd -> Odd + Extra
  1249.         UNROLL(@OOE_ColLoop, @OOE_ColLoop_End)
  1250.         
  1251.         move.l    d1, numBytesPerRow
  1252.         move.l    dstRowStride, -(sp)
  1253.     @OOE_RowLoop:
  1254.         move.l    numBytesPerRow, d0
  1255.         jmp        (a0)
  1256.     @OOE_ColLoop:
  1257. // BLIT
  1258. #define    BLIT \
  1259.         bfextu    (srcPixelP){srcExtraStart:0}, dstRowStride; \
  1260.         bfextu    (dstPixelP){dstExtraStart:0}, d1; \
  1261.         bfextu    (maskPixelP){srcExtraStart:0}, d2; \
  1262.         and.l    d2, d1; \
  1263.         not.l    d2; \
  1264.         and.l    d2, dstRowStride; \
  1265.         or.l    d1, dstRowStride; \
  1266.         bfins    dstRowStride, (dstPixelP){dstExtraStart:0}; \
  1267.         addq.l    ASM_NUM(4), srcPixelP; \
  1268.         addq.l    ASM_NUM(4), dstPixelP; \
  1269.         addq.l    ASM_NUM(4), maskPixelP;
  1270.         REPEAT(BLIT)
  1271. #undef    BLIT
  1272.     @OOE_ColLoop_End:
  1273.         
  1274.         subq.l    ASM_NUM(1), d0
  1275.         bpl        @OOE_ColLoop
  1276. // BLIT EXTRA
  1277.         bfextu    (srcPixelP){srcExtraStart:dstExtraEnd}, d0
  1278.         bfextu    (dstPixelP){dstExtraStart:dstExtraEnd}, d1
  1279.         bfextu    (maskPixelP){srcExtraStart:dstExtraEnd}, d2
  1280.         and.l    d2, d1
  1281.         not.l    d2
  1282.         and.l    d2, d0
  1283.         or.l    d1, d0
  1284.         bfins    d0, (dstPixelP){dstExtraStart:dstExtraEnd}
  1285.         
  1286.         adda.l    srcRowStride, srcPixelP
  1287.         adda.l    (sp), dstPixelP
  1288.         adda.l    srcRowStride, maskPixelP
  1289.         
  1290.         subq.l    ASM_NUM(1), rowsToCopy
  1291.         bgt        @OOE_RowLoop
  1292.         
  1293.         addq.l    ASM_NUM(4), sp
  1294. // STOP
  1295.         bra        @Done
  1296.         
  1297.     @VeryNarrow:
  1298. // START Very Narrow
  1299.     @VN_RowLoop:
  1300. // BLIT
  1301.         bfextu    (srcPixelP){srcExtraStart:dstExtraEnd}, d0
  1302.         bfextu    (dstPixelP){dstExtraStart:dstExtraEnd}, d1
  1303.         bfextu    (maskPixelP){srcExtraStart:dstExtraEnd}, d2
  1304.         and.l    d2, d1
  1305.         not.l    d2
  1306.         and.l    d2, d0
  1307.         or.l    d1, d0
  1308.         bfins    d0, (dstPixelP){dstExtraStart:dstExtraEnd}
  1309.         
  1310.         adda.l    srcRowStride, srcPixelP
  1311.         adda.l    dstRowStride, dstPixelP
  1312.         adda.l    srcRowStride, maskPixelP
  1313.         
  1314.         subq.l    ASM_NUM(1), rowsToCopy
  1315.         bgt        @VN_RowLoop
  1316. // STOP
  1317.         
  1318.     @Done:
  1319.         
  1320.     ASM_END
  1321. }
  1322.  
  1323. #endif    /* GENERATING68K */